package com.tx.core.ddlutil.model;

import com.tx.core.ddlutil.dialect.Dialect4DDL;
import com.tx.core.common.PrioritySupport;

/**
 * 字段接口<br/>
 * <功能详细描述>
 * getColumns
 * <p>
 * TABLE_CAT String => 表类别（可为 null）
 * TABLE_SCHEM String => 表模式（可为 null）
 * TABLE_NAME String => 表名称
 *
 * COLUMN_NAME String => 列名称
 * TYPE_NAME String => 数据源依赖的类型名称，对于 UDT，该类型名称是完全限定的
 * DATA_TYPE int => 来自 java.sql.Types 的 SQL 类型
 * ORDINAL_POSITION int => 表中的列的索引（从 1 开始）
 *
 * COLUMN_SIZE int => 列的大小。对于 char 或 date 类型，列的大小是最大字符数，对于 numeric 和 decimal 类型，列的大小就是精度。
 * DECIMAL_DIGITS int => 小数部分的位数
 * NULLABLE int => 是否允许使用 NULL。
 * REMARKS String => 描述列的注释（可为 null）
 *
 * IS_NULLABLE String => "NO" 表示明确不允许列使用 NULL 值，"YES" 表示可能允许列使用 NULL 值。空字符串表示没人知道是否允许使用 null 值。
 *
 * BUFFER_LENGTH 未被使用。
 * NUM_PREC_RADIX int => 基数（通常为 10 或 2）
 * columnNoNulls - 可能不允许使用 NULL 值
 * columnNullable - 明确允许使用 NULL 值
 * columnNullableUnknown - 不知道是否可使用 null
 * COLUMN_DEF String => 默认值（可为 null）
 * SQL_DATA_TYPE int => 未使用
 * SQL_DATETIME_SUB int => 未使用
 * CHAR_OCTET_LENGTH int => 对于 char 类型，该长度是列中的最大字节数
 *
 * SCOPE_CATLOG String => 表的类别，它是引用属性的作用域（如果 DATA_TYPE 不是 REF，则为null）
 * SCOPE_SCHEMA String => 表的模式，它是引用属性的作用域（如果 DATA_TYPE 不是 REF，则为null）
 * SCOPE_TABLE String => 表名称，它是引用属性的作用域（如果 DATA_TYPE 不是 REF，则为 null）
 * SOURCE_DATA_TYPE short => 不同类型或用户生成 Ref 类型、来自 java.sql.Types 的 SQL 类型的源类型（如果 DATA_TYPE 不是 DISTINCT 或用户生成的 REF，则为null）
 *
 * @author Administrator
 * @version [版本号, 2016年10月24日]
 * @see [相关类/方法]
 * @since [产品/模块版本]
 */
public interface TableColumnDef extends PrioritySupport {

    /**
     * 返回字段名<br/>
     * <功能详细描述>
     *
     * @return [参数说明]
     * @return String [返回类型说明]
     * @throws throws [异常类型] [异常说明]
     * @see [类、类#方法、类#成员]
     */
    public abstract String getName();

    /**
     * 获取表字段注释<br/>
     * <功能详细描述>
     *
     * @return [参数说明]
     * @return String [返回类型说明]
     * @throws throws [异常类型] [异常说明]
     * @see [类、类#方法、类#成员]
     */
    public String getComment();

    /**
     * 返回对应的jdbcType类型
     * <功能详细描述>
     *
     * @return [参数说明]
     * @return JdbcTypeEnum [返回类型说明]
     * @throws throws [异常类型] [异常说明]
     * @see [类、类#方法、类#成员]
     */
    public abstract JdbcTypeEnum getJdbcType();

    /**
     * 获取字段长度
     * <功能详细描述>
     *
     * @return [参数说明]
     * @return int [返回类型说明]
     * @throws throws [异常类型] [异常说明]
     * @see [类、类#方法、类#成员]
     */
    public abstract int getSize();

    /**
     * 获取字段精度<br/>
     * <功能详细描述>
     *
     * @return [参数说明]
     * @return int [返回类型说明]
     * @throws throws [异常类型] [异常说明]
     * @see [类、类#方法、类#成员]
     */
    public abstract int getScale();

    /**
     * 获取默认值<br/>
     * <功能详细描述>
     *
     * @return [参数说明]
     * @return String [返回类型说明]
     * @throws throws [异常类型] [异常说明]
     * @see [类、类#方法、类#成员]
     */
    public abstract String getDefaultValue();

    /**
     * 是否必填<br/>
     * <功能详细描述>
     *
     * @return [参数说明]
     * @return boolean [返回类型说明]
     * @throws throws [异常类型] [异常说明]
     * @see [类、类#方法、类#成员]
     */
    public boolean isRequired();

    /**
     * 设置是否为必填<br/>
     * <功能详细描述>
     *
     * @param required [参数说明]
     * @return void [返回类型说明]
     * @throws throws [异常类型] [异常说明]
     * @see [类、类#方法、类#成员]
     */
    public void setRequired(boolean required);

    /**
     * 设置表注释<br/>
     * <功能详细描述>
     *
     * @param comment [参数说明]
     * @return void [返回类型说明]
     * @throws throws [异常类型] [异常说明]
     * @see [类、类#方法、类#成员]
     */
    public void setComment(String comment);

    /**
     * 返回字段定义字符串<br/>
     * <功能详细描述>
     *
     * @return [参数说明]
     * @return String [返回类型说明]
     * @throws throws [异常类型] [异常说明]
     * @see [类、类#方法、类#成员]
     */
    public abstract String getColumnType(Dialect4DDL ddlDialect);
}